home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / wsc4c21.zip / SIMPLE.C < prev    next >
C/C++ Source or Header  |  1997-05-22  |  10KB  |  354 lines

  1. /*
  2. **  SIMPLE.C
  3. **
  4. **  Very simple terminal emulator example program.
  5. **
  6. */
  7.  
  8. #include <windows.h>
  9.  
  10. #ifdef WIN32
  11. #define USE_INS HINSTANCE
  12. #define USE_PTR PSTR
  13. #else
  14. #define USE_INS HANDLE
  15. #define USE_PTR LPSTR
  16. #endif
  17.  
  18. #include "simple.h"
  19. #include "wsc.h"
  20. #include "sioerror.h"
  21. #include "ascii.h"
  22. #include "message.h"
  23. #include "line.h"
  24. #include "paint.h"
  25. #include "about.h"
  26.  
  27. /* public globals */
  28.  
  29. HWND hMainWnd;            /* main window handle */
  30. int OnLineFlag = FALSE;   /* TRUE: online */
  31. int FatalFlag = FALSE;    /* TRUE: fatal error */
  32.  
  33. /* private globals */
  34.  
  35. static HMENU hMenu;
  36. static HINSTANCE hInstance;
  37. static int ThePort = COM1;
  38. static int TheBaud = Baud19200;
  39. static int WinWidth = 8 * NCOLS;
  40. static int WinHeight = 12 * NROWS + 48;
  41. static long BaudRateList[10]
  42.        = {300L,600L,1200L,2400L,4800L,9600L,19200L,38400L,57600L,115200L};
  43. static char Temp[1024];
  44.  
  45. /* miscellaneous functions */
  46.  
  47. int ErrorCheck(int);
  48.  
  49. #ifdef WIN32
  50. int WINAPI
  51. #else
  52. int PASCAL
  53. #endif
  54. WinMain(USE_INS hInst, USE_INS hPrevInstance, USE_PTR lpCmdLine, int nCmdShow)
  55. {WNDCLASS wc;
  56.  MSG  msg;
  57.  BOOL Result;
  58.  if(!hPrevInstance)
  59.    {/* register main window class */
  60.     wc.style = CS_HREDRAW | CS_VREDRAW;
  61.     wc.lpfnWndProc = MainWndProc;
  62.     wc.cbClsExtra = 0;
  63.     wc.cbWndExtra = 0;
  64.     wc.hInstance = hInst;
  65.     wc.hIcon = LoadIcon(hInst, "SimpleIcon");
  66.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  67.     wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  68.     wc.lpszMenuName =  "SimpleMenu";
  69.     wc.lpszClassName = "SimpleWClass";
  70.     Result = RegisterClass(&wc);
  71.     if(!Result) return FALSE;
  72.    }
  73.  
  74.  /* create main window */
  75.  hInstance = hInst;
  76.  hMainWnd = CreateWindow(
  77.    "SimpleWClass",
  78.    "SIMPLE",
  79.    WS_OVERLAPPEDWINDOW,
  80.    CW_USEDEFAULT,
  81.    CW_USEDEFAULT,
  82.    WinWidth,
  83.    WinHeight,
  84.    NULL,
  85.    NULL,
  86.    hInstance,
  87.    NULL);
  88.  ShowWindow(hMainWnd, nCmdShow);
  89.  UpdateWindow(hMainWnd);
  90.  hMenu = GetMenu(hMainWnd);
  91.  
  92.  /* window control loop */
  93.  
  94.  while(GetMessage(&msg,NULL,0,0))
  95.    {
  96.     TranslateMessage(&msg);
  97.     DispatchMessage(&msg);
  98.    }
  99.  return (msg.wParam);
  100. } /* end WinMain */
  101.  
  102. #ifdef WIN32
  103. LRESULT CALLBACK
  104. #else
  105. long FAR PASCAL
  106. #endif
  107. MainWndProc(HWND hWindow,UINT iMsg,WPARAM wParam,LPARAM lParam)
  108. {int i;
  109.  UINT idTimer;
  110.  HDC  hDC;
  111.  PAINTSTRUCT ps;
  112.  int TheChar;
  113.  int Count;
  114. #ifdef WIN32
  115. #else
  116.  static FARPROC lpfnAboutDlgProc;
  117. #endif
  118.  hMainWnd = hWindow;
  119.  switch (iMsg)
  120.     {
  121.      case WM_COMMAND:
  122.     switch(wParam)
  123.       {case MSG_ABOUT:
  124. #ifdef WIN32
  125.          DialogBox(hInstance,"AboutBox",hMainWnd,AboutDlgProc);
  126. #else
  127.          DialogBox(hInstance,"AboutBox",hMainWnd,lpfnAboutDlgProc);
  128. #endif
  129.          break;
  130.  
  131.        case MSG_DEBUG:
  132.          /* put whatever you want here! */
  133.          wsprintf((LPSTR)Temp,"Expires in %u seconds.", SioInfo('?') );
  134.          DisplayLine((LPSTR)Temp);
  135.  
  136.          break;
  137.  
  138.        case MSG_ONLINE:
  139.          if(OnLineFlag) break;
  140.          else
  141.            {/* try to go on-line */
  142.             if(GoOnLine(ThePort,TheBaud,1024,512))
  143.               {/* we're online */
  144.                OnLineFlag = TRUE;
  145.                wsprintf((LPSTR)Temp,(LPSTR)"SIMPLE: COM%d online at %ld baud",
  146.                1+ThePort,BaudRateList[TheBaud]);
  147.                SetWindowText(hMainWnd,Temp);
  148.                CheckMenuItem(hMenu,MSG_OFFLINE,MF_BYCOMMAND | MF_UNCHECKED);
  149.                CheckMenuItem(hMenu,MSG_ONLINE,MF_BYCOMMAND | MF_CHECKED);
  150.                for(i=MSG_COM1;i<=MSG_COM4;i++)
  151.                  EnableMenuItem(hMenu,i,MF_BYCOMMAND|MF_GRAYED);
  152.                for(i=MSG_300;i<=MSG_115200;i++)
  153.                  EnableMenuItem(hMenu,i,MF_BYCOMMAND|MF_GRAYED);
  154.               }
  155.            }
  156.          break;
  157.  
  158.        case MSG_OFFLINE:
  159.          if(!OnLineFlag) break;
  160.          GoOffLine(ThePort);
  161.          OnLineFlag = FALSE;
  162.          SetWindowText(hMainWnd,"SIMPLE: Offline");
  163.          CheckMenuItem(hMenu,MSG_ONLINE,MF_BYCOMMAND | MF_UNCHECKED);
  164.          CheckMenuItem(hMenu,MSG_OFFLINE,MF_BYCOMMAND | MF_CHECKED);
  165.          for(i=MSG_COM1;i<=MSG_COM4;i++)
  166.            EnableMenuItem(hMenu,i,MF_BYCOMMAND|MF_ENABLED);
  167.          for(i=MSG_300;i<=MSG_115200;i++)
  168.            EnableMenuItem(hMenu,i,MF_BYCOMMAND|MF_ENABLED);
  169.          break;
  170.  
  171.        case MSG_EXIT:
  172.          DestroyWindow(hMainWnd);
  173.          break;
  174.  
  175.        case MSG_COM1:
  176.          CheckMenuItem(hMenu,MSG_COM1+ThePort,MF_BYCOMMAND | MF_UNCHECKED);
  177.          ThePort = COM1;
  178.          CheckMenuItem(hMenu,MSG_COM1,MF_BYCOMMAND | MF_CHECKED);
  179.          break;
  180.  
  181.        case MSG_COM2:
  182.          CheckMenuItem(hMenu,MSG_COM1+ThePort,MF_BYCOMMAND | MF_UNCHECKED);
  183.          ThePort = COM2;
  184.          CheckMenuItem(hMenu,MSG_COM2,MF_BYCOMMAND | MF_CHECKED);
  185.          break;
  186.  
  187.        case MSG_COM3:
  188.          CheckMenuItem(hMenu,MSG_COM1+ThePort,MF_BYCOMMAND | MF_UNCHECKED);
  189.          ThePort = COM3;
  190.          CheckMenuItem(hMenu,MSG_COM3,MF_BYCOMMAND | MF_CHECKED);
  191.          break;
  192.  
  193.        case MSG_COM4:
  194.          CheckMenuItem(hMenu,MSG_COM1+ThePort,MF_BYCOMMAND | MF_UNCHECKED);
  195.          ThePort = COM4;
  196.          CheckMenuItem(hMenu,MSG_COM4,MF_BYCOMMAND | MF_CHECKED);
  197.          break;
  198.  
  199.        case MSG_300:
  200.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  201.          TheBaud = Baud300;
  202.          CheckMenuItem(hMenu,MSG_300,MF_BYCOMMAND | MF_CHECKED);
  203.          break;
  204.  
  205.        case MSG_1200:
  206.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  207.          TheBaud = Baud1200;
  208.          CheckMenuItem(hMenu,MSG_1200,MF_BYCOMMAND | MF_CHECKED);
  209.          break;
  210.  
  211.        case MSG_2400:
  212.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  213.          TheBaud = Baud2400;
  214.          CheckMenuItem(hMenu,MSG_2400,MF_BYCOMMAND | MF_CHECKED);
  215.          break;
  216.  
  217.        case MSG_4800:
  218.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  219.          TheBaud = Baud4800;
  220.          CheckMenuItem(hMenu,MSG_4800,MF_BYCOMMAND | MF_CHECKED);
  221.          break;
  222.  
  223.        case MSG_9600:
  224.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  225.          TheBaud = Baud9600;
  226.          CheckMenuItem(hMenu,MSG_9600,MF_BYCOMMAND | MF_CHECKED);
  227.          break;
  228.  
  229.        case MSG_19200:
  230.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  231.          TheBaud = Baud19200;
  232.          CheckMenuItem(hMenu,MSG_19200,MF_BYCOMMAND | MF_CHECKED);
  233.          break;
  234.  
  235.        case MSG_38400:
  236.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  237.          TheBaud = Baud38400;
  238.          CheckMenuItem(hMenu,MSG_38400,MF_BYCOMMAND | MF_CHECKED);
  239.          break;
  240.  
  241.        case MSG_57600:
  242.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  243.          TheBaud = Baud57600;
  244.          CheckMenuItem(hMenu,MSG_57600,MF_BYCOMMAND | MF_CHECKED);
  245.          break;
  246.  
  247. #ifdef WIN32
  248.        case MSG_115200:
  249.          CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_UNCHECKED);
  250.          TheBaud = Baud115200;
  251.          CheckMenuItem(hMenu,MSG_115200,MF_BYCOMMAND | MF_CHECKED);
  252.          break;
  253. #endif
  254.  
  255.        default:
  256.          return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
  257.       }
  258.     break;
  259.  
  260.     case WM_CREATE:
  261.  
  262.       /* check "OFFLINE" menu item */
  263.       hMenu = GetMenu(hMainWnd);
  264.       CheckMenuItem(hMenu,MSG_OFFLINE,MF_BYCOMMAND | MF_CHECKED);
  265.       /* check default COM port */
  266.       CheckMenuItem(hMenu,MSG_COM1+ThePort,MF_BYCOMMAND | MF_CHECKED);
  267.       /* check default baud rate */
  268.       CheckMenuItem(hMenu,MSG_300+TheBaud,MF_BYCOMMAND | MF_CHECKED);
  269. #ifdef WIN32
  270. #else
  271.       /* create AboutDlgProc() thunk */
  272.       lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInstance);
  273. #endif
  274.       /* initialize paint module */
  275.       PaintInit();
  276.       /* start timer */
  277.       idTimer = SetTimer(hMainWnd,1,125,NULL);
  278.       if(idTimer==0)
  279.         {MessageBox(hMainWnd,"No timers remaining !","ERROR",MB_ICONEXCLAMATION | MB_OK);
  280.          FatalFlag = TRUE;
  281.         }
  282.       break;
  283.  
  284.     case WM_CHAR:
  285.       ErrorCheck(SioPutc(ThePort, (char)wParam ) );
  286.       break;
  287.  
  288.     case WM_TIMER:
  289.       /* fatal error ? */
  290.       if(FatalFlag) break;
  291.       if(!OnLineFlag) break;
  292.       /* fetch line of up to 1024 chars */
  293.       Count = 0;
  294.       for(i=0;i<1024;i++)
  295.         {TheChar = SioGetc(ThePort);
  296.          /* character available ? */
  297.          if(TheChar==WSC_NO_DATA) break;
  298.          else if(ErrorCheck(TheChar)<0) break;
  299.          Temp[Count++] = TheChar;
  300.          if((char)TheChar==(char)LF) break;
  301.         } /* end while */
  302.       if(Count>0) WriteTheString(Temp,Count);
  303.       break;
  304.  
  305.     case WM_SETFOCUS:
  306.       /* create client area caret */
  307.       CreateCaret(hMainWnd,NULL,3,10);
  308.       SetCaretPos(PaintGetColPos(),PaintGetRowPos());
  309.       ShowCaret(hMainWnd);
  310.       ShowCaret(hMainWnd);
  311.       break;
  312.  
  313.     case WM_KILLFOCUS:
  314.       DestroyCaret();
  315.       break;
  316.  
  317.     case WM_PAINT:
  318.       HideCaret(hMainWnd);
  319.       hDC = BeginPaint(hMainWnd, &ps);
  320.       SetMapMode(hDC,MM_ANISOTROPIC);
  321.       SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) );
  322.       PaintMain(hDC,&ps);
  323.       EndPaint(hMainWnd,&ps);
  324.       SetCaretPos(PaintGetColPos(),PaintGetRowPos());
  325.       ShowCaret(hMainWnd);
  326.       break;
  327.  
  328.     case WM_DESTROY:
  329.       GoOffLine(ThePort);
  330.       SetWindowText(hMainWnd,"SIMPLE: Offline");
  331.       CheckMenuItem(hMenu,MSG_OFFLINE,MF_BYCOMMAND | MF_CHECKED);
  332.       CheckMenuItem(hMenu,MSG_ONLINE,MF_BYCOMMAND | MF_UNCHECKED);
  333.       if(idTimer) KillTimer(hMainWnd,idTimer);
  334.       PostQuitMessage(0);
  335.       break;
  336.  
  337.     default:
  338.       return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
  339.    }
  340.  return 0;
  341.  
  342. } /* end MainWndProc */
  343.  
  344. int ErrorCheck(int Code)
  345. {/* trap PCL error codes */
  346.  if(Code<0)
  347.    {SioError(Code,"");
  348.     SioRxClear(ThePort);
  349.     SioDone(ThePort);
  350.     FatalFlag = TRUE;
  351.    }
  352.  return Code;
  353. } /* end ErrorCheck */
  354.